/**************************************************************************

Copyright: sherlock
Author: sherlock
Date: 2021-2-28
Description: encapsulation base in libuv timer

**************************************************************************/

#ifndef TIMER_H
#define TIMER_H

#include "header.h"

class TimerPrivateData;
class Timer
{
public:
    /**
     * @brief:  计时器回调函数指针
     * @param:  userData，用户自定义数据
     * @author: sherlock
     */
    typedef void (*OnTimer)(void *userData);

public:
    explicit Timer();

    virtual ~Timer();

    /**
     * @brief: 开始计时器
     * @param:  timeout，ms，开始后第一次执行之间的时间间隔
     * @param:  repeat，ms，第二次及其以后执行之间的时间间隔
     * @author: sherlock
     */
    void start(uint64_t timeout, uint64_t repeat);

    /**
     * @brief:  停止计时器
     * @author: sherlock
     */
    void stop();

    /**
     * @brief: 设置计时器回调函数，计时器会定时执行回调
     * @param: userData，用于自定义数据
     * @author: sherlock
     */
    void setTimerCallback(OnTimer onTimer, void *userData);

private:
    /**
     * @brief:  计时器回调函数，勿动
     * @author: sherlock
     */
    static void timerCB(uv_timer_t *handle);

private:
    std::unique_ptr<TimerPrivateData> data;

};

#endif //TIMER_H
